package org.nobject.common.log;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 日志类
 * 
 * @author bianrongjun
 * @version 1.0
 */
public class Log {
	
	/** 日期格式 */
	public static String fmtDate="[yyyy-MM-dd HH:mm:ss]";
	
	/** 级别格式键值 */
	private static String fmtLevelkey="_LV_";
	
	/** 级别格式 */
	private static String fmtLevel="["+fmtLevelkey+"]";
	
	/** 级别编码 */
	public final static class TypeCode{
		/** 调试 */
		public final static int debug=3;
		/** 信息 */
		public final static int info=5;
		/** 警告 */
		public final static int warn=7;
		/** 错误 */
		public final static int error=11;
	}
	
	/** 日志级别 */
	public static int logLevel=TypeCode.debug*TypeCode.info*TypeCode.warn*TypeCode.error;
	
	/** 级别标题 */
	public static class TypeTitles{
		/** 英文 */
		public static String[] EN=new String[]{"DBUG","INFO","WARN","ERRO"};
		/** 中文 */
		public static String[] ZHCN=new String[]{"调试","信息","警告","错误"};
	}
	
	/** 级别标题 */
	public static String[] typeTitle=null;
	
	public enum Language{ZHCN,EN;}
	
	/** 
	 * 设置语言
	 * @param language 语言
	 */
	public static void setLanguage(Language language){
		switch(language){
			case ZHCN:
				typeTitle=TypeTitles.ZHCN;
				break;
			case EN:
				typeTitle=TypeTitles.EN;
				break;	
		}
	}
	
	/** 初始化语言 */
	static{
		setLanguage(Language.EN);
	}
	
	/**
	 * 调试
	 * @param msg 信息
	 */
	public static void debug(String msg) {
		print(TypeCode.debug, msg);
	}
	/** 
	 * debug
	 * @param msg
	 * @param t
	 */
	public static void debug(String msg,Throwable t) {
		print(TypeCode.debug, msg+t.getMessage());
		t.printStackTrace();
	}
	/**
	 * 信息
	 * @param msg 信息
	 */
	public static void info(String msg) {
		print(TypeCode.info, msg);
	}
	public static void info(String msg,Throwable t) {
		print(TypeCode.info, msg+t.getMessage());
		t.printStackTrace();
	}
	/**
	 * 警告
	 * @param msg 信息
	 */
	public static void warn(String msg) {
		print(TypeCode.warn, msg);
	}
	public static void warn(String msg,Throwable t) {
		print(TypeCode.warn, msg+t.getMessage());
		t.printStackTrace();
	}
	/**
	 * 错误
	 * @param msg 信息
	 */
	public static void error(String msg) {
		print(TypeCode.error, msg);
	}
	public static void error(String msg,Throwable t) {
		print(TypeCode.error, msg+t.getMessage());
		t.printStackTrace();
	}

	/** 
	 * 获取级别字符串
	 * @param lv 级别
	 */
	public static String getStrLevel(String lv){
		return fmtLevel.replaceAll(fmtLevelkey, lv);
	}
	
	/**
	 * 打印
	 * @param level 级别
	 * @param msg 信息
	 */
	private static void print(int level, String msg) {
		if(logLevel%level!=0) return;
		StringBuffer head = new StringBuffer();
		String title=null;
		switch (level) {
			case TypeCode.debug:title=typeTitle[0];break;
			case TypeCode.info:title=typeTitle[1];break;
			case TypeCode.warn:title=typeTitle[2];break;
			case TypeCode.error:title=typeTitle[3];break;
		}
		head.append(new SimpleDateFormat(fmtDate).format(new Date())).append(getStrLevel(title)).append(msg);
		System.out.println(head.toString());
	}
}
